const WebSocket = require('ws');
const net = require('net');
const express = require('express');
const cors = require('cors');
const httpProxy = require('http-proxy');

// 配置参数
const CAR_TCP_IP = '192.168.137.24'; // 小车IP
const CAR_TCP_PORT = 6000; // 指令服务端口
const CAR_VIDEO_HOST = '192.168.137.24'; // 视频服务IP
const CAR_VIDEO_PORT = 6500; // 视频服务端口
const HTTP_PORT = 8080; // 本地桥接服务端口

const app = express();
app.use(cors());

// 视频流代理（转发到小车6500端口）
const proxy = httpProxy.createProxyServer();
app.get('/video_feed', (req, res) => {
  const target = `http://${CAR_VIDEO_HOST}:${CAR_VIDEO_PORT}`;
  proxy.web(req, res, { target, changeOrigin: true }, (err) => {
    console.error('视频流代理出错:', err);
    res.status(502).send('视频流代理失败');
  });
});

// === TCP 连接管理（仅建立连接，不发送初始化指令） ===
let tcpClient = null;
let tcpConnected = false;

function ensureTcpConnection() {
  if (tcpConnected && tcpClient && !tcpClient.destroyed) {
    return tcpClient;
  }

  // 关闭旧连接（如果存在）
  if (tcpClient) {
    tcpClient.destroy();
  }

  // 建立新的 TCP 连接（仅连接，不发送指令）
  tcpClient = new net.Socket();
  tcpClient.connect(CAR_TCP_PORT, CAR_TCP_IP, () => {
    tcpConnected = true;
    console.log('[TCP] 已连接小车6000端口（指令服务）');
  });

  // TCP 接收数据转发到 WebSocket
  tcpClient.on('data', (data) => {
    const msg = data.toString();
    console.log('[TCP → Web] 小车响应:', msg);
    wss.clients.forEach((client) => {
      if (client.readyState === WebSocket.OPEN) {
        client.send(msg);
      }
    });
  });

  tcpClient.on('error', (err) => {
    console.error('[TCP] 错误:', err.message);
    tcpConnected = false;
  });

  tcpClient.on('close', () => {
    console.log('[TCP] 连接关闭');
    tcpConnected = false;
  });

  return tcpClient;
}

// === /init 接口：仅触发初始化（不发送自定义指令） ===
app.get('/init', (req, res) => {
  console.log('[HTTP /init] 收到初始化请求，触发后端服务启动');
  // 仅建立 TCP 连接（6000端口），不发送 $010F000000#
  const client = ensureTcpConnection();
  if (client) {
    res.send('初始化完成：已启动6000指令端口和6500视频端口');
  } else {
    res.status(500).send('初始化失败：无法连接小车');
  }
});

// === WebSocket 服务（仅转发指令，不额外处理） ===
const server = require('http').createServer(app);
const wss = new WebSocket.Server({ server });

wss.on('connection', (ws) => {
  console.log('[WebSocket] 客户端已连接');

  // 确保 TCP 连接已建立
  ensureTcpConnection();

  // 转发 WebSocket 指令到 TCP
  ws.on('message', (message) => {
    const cmd = message.toString().trim();
    if (!cmd.startsWith('$') || !cmd.endsWith('#')) {
      ws.send('[错误] 指令格式必须为 $...#');
      return;
    }

    if (tcpConnected && tcpClient) {
      tcpClient.write(cmd);
      console.log('[Web → TCP] 发送指令:', cmd);
    } else {
      ws.send('[错误] TCP未连接，指令发送失败');
    }
  });

  ws.on('close', () => {
    console.log('[WebSocket] 客户端断开');
  });
});

// 启动服务
server.listen(HTTP_PORT, () => {
  console.log(`✅ 服务已启动:HTTP + WebSocket 监听 ${HTTP_PORT}`);
  console.log(`- 指令服务：通过 /init 触发连接小车 ${CAR_TCP_IP}:6000`);
  console.log(`- 视频服务：代理小车 ${CAR_VIDEO_HOST}:6500 → /video_feed`);
});
